from app import create_app, db
from app.models import User, Article, SocialMediaPost, Keyword, SentimentHistory
from werkzeug.security import generate_password_hash
from datetime import datetime, timedelta
import random
import json

def init_db():
    """初始化数据库"""
    app = create_app()
    with app.app_context():
        # 创建数据库表
        db.create_all()
        
        # 检查是否已有用户
        if User.query.count() == 0:
            # 创建管理员用户
            admin = User(
                username='admin',
                email='admin@example.com',
                password=generate_password_hash('admin123')
            )
            db.session.add(admin)
            
            # 创建测试用户
            test_user = User(
                username='test',
                email='test@example.com',
                password=generate_password_hash('test123')
            )
            db.session.add(test_user)
            
            db.session.commit()
            print('已创建初始用户')
        
        # 检查是否已有文章
        if Article.query.count() == 0:
            # 创建模拟文章数据
            sources = ['新浪新闻', '腾讯新闻', '网易新闻', '人民网', '新华网']
            sentiments = ['正面', '负面', '中性']
            
            # 创建一些关键词
            keywords_list = [
                '经济', '政治', '科技', '教育', '医疗', '环保', '文化', '体育',
                '娱乐', '社会', '国际', '军事', '财经', '健康', '旅游', '汽车'
            ]
            
            # 保存关键词
            for keyword in keywords_list:
                kw = Keyword(word=keyword, frequency=random.randint(10, 100))
                db.session.add(kw)
            
            # 创建模拟文章
            for i in range(50):
                # 随机日期（最近30天内）
                days_ago = random.randint(0, 29)
                pub_date = datetime.now() - timedelta(days=days_ago)
                
                # 随机选择3-5个关键词
                article_keywords = random.sample(keywords_list, random.randint(3, 5))
                
                # 随机情感
                sentiment = random.choice(sentiments)
                
                article = Article(
                    title=f'测试文章标题 #{i+1}',
                    content=f'这是测试文章内容 #{i+1}，包含了一些关于{", ".join(article_keywords[:2])}的信息。' * 3,
                    url=f'https://example.com/article/{i+1}',
                    source=random.choice(sources),
                    sentiment=sentiment,
                    keywords=json.dumps(article_keywords),
                    published_at=pub_date,
                    collected_at=pub_date + timedelta(hours=random.randint(1, 5))
                )
                db.session.add(article)
            
            db.session.commit()
            print('已创建模拟文章数据')
        
        # 检查是否已有社交媒体帖子
        if SocialMediaPost.query.count() == 0:
            # 创建模拟社交媒体帖子
            platforms = ['微博', '微信', '知乎', '抖音', '小红书']
            locations = ['北京', '上海', '广州', '深圳', '杭州', '成都', '武汉', '南京', '西安', '重庆']
            sentiments = ['正面', '负面', '中性']
            
            # 创建模拟帖子
            for i in range(50):
                # 随机日期（最近30天内）
                days_ago = random.randint(0, 29)
                pub_date = datetime.now() - timedelta(days=days_ago)
                
                # 随机选择2-4个关键词
                post_keywords = random.sample(keywords_list, random.randint(2, 4))
                
                # 随机情感
                sentiment = random.choice(sentiments)
                
                post = SocialMediaPost(
                    platform=random.choice(platforms),
                    content=f'这是测试社交媒体帖子内容 #{i+1}，包含了一些关于{", ".join(post_keywords[:2])}的观点。',
                    author=f'用户{random.randint(1000, 9999)}',
                    url=f'https://example.com/post/{i+1}',
                    sentiment=sentiment,
                    keywords=json.dumps(post_keywords),
                    location=random.choice(locations),
                    published_at=pub_date,
                    collected_at=pub_date + timedelta(minutes=random.randint(10, 60))
                )
                db.session.add(post)
            
            db.session.commit()
            print('已创建模拟社交媒体帖子数据')
        
        # 检查是否已有情感历史记录
        if SentimentHistory.query.count() == 0:
            # 创建模拟情感历史记录（最近30天）
            for i in range(30):
                date = (datetime.now() - timedelta(days=29-i)).date()
                
                # 随机情感计数
                positive = random.randint(5, 20)
                negative = random.randint(3, 15)
                neutral = random.randint(8, 25)
                
                history = SentimentHistory(
                    date=date,
                    positive_count=positive,
                    negative_count=negative,
                    neutral_count=neutral
                )
                db.session.add(history)
            
            db.session.commit()
            print('已创建模拟情感历史记录')
        
        print('数据库初始化完成')

if __name__ == '__main__':
    init_db() 